package chapter07._03_TipsForException;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.EmptyStackException;
import java.util.Stack;

/**
 * @Description: 使用异常的技巧
 * @LastDate: 2020/11/4
 */
public class Test07_TipsForExceptions {

    /*
    * 1. 异常处理不能替代简单测试 原因：前者耗时过长
    *
    * 2. 不要过分细化异常 不要把每一步都独立包装在try块中
    * 原因：(1) 代码臃肿 (2) 出现问题 不会取消整个任务
    * 做法：把所有任务包含在一个try块中
    *
    * 3. 利用好异常的层次结构 不要只catch Runtime/Throwable
    *    将异常转化成另一种更好的异常 比如catch NumberFormatException -> IOException或其他
    *
    * 4. 不要压制异常/不要羞于传递抛出异常 "早抛出 晚捕获"
    * 原因：一旦出现问题 异常会被忽略 调用者无法知晓
    * 做法：更好的做法是传递出去 让最终调用者去处理异常
    *
    * 5. 在可能出错/检测错误的代码处 认真抛出异常
    *    比如使用栈 为空时弹出 最好抛出一个栈空异常 这样好过以后抛出一个空指针异常
    * */

    public void point2() throws FileNotFoundException {
        //错误做法
        PrintStream out = new PrintStream("");
        Stack<Integer> st = new Stack<>();
        int n = 0;

        for (int i = 0; i < 100; i++) {
            try {
                n = st.pop();
            } catch (EmptyStackException e) {
                //log statck was empty
            }
            out.write(n);
        }

        //正确做法
        try {
            for (int i = 0; i < 100; i++) {
                n = st.pop();
                out.write(n);
            }
        } catch (EmptyStackException e) {
            //processing
        }
    }

    public void point4() throws FileNotFoundException { //not a sign of shame
        //wrong
        try {
            var in = new FileOutputStream("");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        //better
        //throws exception in the method head
    }
}
